1. StringIO

  • 很多时候,数据读写不一定是文件,也可以在内存中读写

  • StringIO 的作用: 在内存中对字符串进行读写操作

  • 注意:

    • 写入的数据必须是字符串类型的数据

    • 通过 StringIO 所生成的内存对象都可以使用文件操作中的一些方法如: .read() .seek(num) .readline() ……

    • .getvalue() 和 .read()的区别:
      • .getvalue() -> 读取内存中的所有内容
      • .read() -> 读取光标所在位置后面的内容,有时候使用.read()方法读取内存中内容返回的则是一个空,是因为通过.write()方法将字符串写入内存后,此时的光标是停留在最后面的,所以获取到的内容是空,解决办法: 先执行 .seek(num) 修改光标位置的方法,然后再调用 .read() 方法

  • 导入 StringIO

from io import StringIO

  • 写法一

from io import StringIO

f = StringIO()  # 生成一个内存对象,相当于文件句柄
f.write('中文')  # 将字符串内容写入内存中,每一次写入都会覆盖掉上一次的内容
f_content = f.getvalue()  # 读取内存中所写入的所有内容

print(f_content)  # 中文

  • 写法二

from io import StringIO

f = StringIO('中文')  # 直接生成一个有内容的内存对象,相当于给了一个默认值
f_content = f.getvalue()  # 读取内存中的所有内容
f_content = f.read()  # 读取光标所在位置后面的内容,因为是直接生成一个有内容的内存对象,此时的光标在第一位,所以可以获取到内存中的全部内容

print(f_content)  # 中文

2. BytesIO

  • 很多时候,数据读写不一定是文件,也可以在内存中读写

  • BytesIO 的作用: 在内存中对二进制数据(即: bytes类型的数据)进行读写操作,相当于文件操作的中 rb 和 wb 操作

  • 注意:

    • 写入的数据必须是bytes类型的数据

    • 通过 BytesIO 所生成的内存对象都可以使用文件操作中的一些方法如: .read() .seek(num) .readline() ……

    • .getvalue() 和 .read()的区别:
      • .getvalue() -> 读取内存中的所有内容
      • .read() -> 读取光标所在位置后面的内容,有时候使用.read()方法读取内存中内容返回的则是一个空,是因为通过.write()方法将字符串写入内存后,此时的光标是停留在最后面的,所以获取到的内容是空,解决办法: 先执行 .seek(num) 修改光标位置的方法,然后再调用 .read() 方法

  • 导入 BytesIO

from io import BytesIO

  • 写法一

from io import BytesIO

f = BytesIO()  # 生成一个内存对象,相当于文件句柄
f.write('中文'.encode('utf-8'))  # 将bytes类型的数据写入内存中,每一次写入都会覆盖掉上一次的内容
f_content = f.getvalue()  # 读取内存中所写入的所有内容

print(f_content)  # b'\xe4\xb8\xad\xe6\x96\x87'
print(f_content.decode('utf-8'))  # 中文

  • 写法二

from io import BytesIO

f = BytesIO(b'\xe4\xb8\xad\xe6\x96\x87')  # 直接生成一个有内容的内存对象,相当于给了一个默认值
f_content = f.getvalue()  # 读取内存中的所有内容
f_content = f.read()  # 读取光标所在位置后面的内容,因为是直接生成一个有内容的内存对象,此时的光标在第一位,所以可以获取到内存中的全部内容

print(f_content)  # b'\xe4\xb8\xad\xe6\x96\x87'
print(f_content.decode('utf-8'))  # 中文